package com.nd.android.musicboxlibrary.util;

import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import com.nd.android.musicboxlibrary.business.comm.NdException;

/**
 * 异步任务，无UI Created 2014-9-5 下午9:31:41
 * 
 * @version
 * @author zxq
 * 
 * @see
 */
public abstract class NdThread {
    private Thread mThread;

    /**
     * Creates a new instance of NdThread. Created 2014年9月11日 下午11:18:54
     */
    public NdThread() {
        super();
        mThread = new Thread() {
            @Override
            public void run() {
                Message msg = new Message();
                try {
                    msg.what = 0;
                    msg.obj = doInBackground();
                } catch (NdException e) {
                    msg.what = 1;
                    msg.obj = e;
                }
                mHandler.sendMessage(msg);
            }
        };
    }

    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 0:
                doSuccess(msg.obj);
                break;

            case 1:
                doFail((NdException) msg.obj);
                break;

            default:
                break;
            }
        }
    };

    /**
     * 后台任务处理 Created 2014年9月11日 下午11:18:32
     * 
     * @return Object 返回结果
     * @throws NdException
     *             异常
     * @author zxq
     */
    protected abstract Object doInBackground() throws NdException;

    /**
     * 处理成功 Created 2014年9月11日 下午11:18:35
     * 
     * @param result
     *            成功结果
     * @author zxq
     */
    protected abstract void doSuccess(Object result);

    /**
     * 处理失败 Created 2014年9月11日 下午11:18:38
     * 
     * @param e
     *            异常
     * @author zxq
     */
    protected abstract void doFail(NdException e);

    /**
     * 取消 Created 2014年9月11日 下午11:18:42
     * 
     * @author zxq
     */
    public void cancel() {
        if (mThread != null && mThread.isAlive()) {
            mThread.interrupt();
        }
    }

    /**
     * 执行 Created 2014年9月11日 下午11:18:48
     * 
     * @author zxq
     */
    public void execute() {
        if (mThread != null) {
            mThread.start();
        }
    }
}
